home *** CD-ROM | disk | FTP | other *** search
/ NOVA - For the NeXT Workstation / NOVA - For the NeXT Workstation.iso / Apps / Graphics / Viewers / Magnify / Magnify.m < prev    next >
Text File  |  1992-12-25  |  5KB  |  200 lines

  1. /* File: Magnify.m - Application class for 'Magnify'
  2.  *
  3.  * By: Christopher Lane
  4.  * Symbolic Systems Resources Group
  5.  * Knowledge Systems Laboratory
  6.  * Stanford University
  7.  *
  8.  * Date: 9 January 1992
  9.  *
  10.  * Copyright: 1990, 1991 & 1992 by The Leland Stanford Junior University.
  11.  * This program may be distributed without restriction for non-commercial use.
  12.  */
  13.  
  14. #import <ctype.h>
  15.  
  16. #import "Magnify.h"
  17.  
  18. #define WINDOWTITLEFORMAT "%.2gx Magnification"
  19. #define WINDOWTITLEPROTOTYPE "0.00x Magnification"
  20.  
  21. static NXDefaultsVector MagnifyDefaults = {
  22.     { SCALEDEFAULTSTRING, DEFAULTSCALESTRING },
  23.     { GRIDDEFAULTSTRING, DEFAULTGRIDSTRING },
  24.     { UPDATEDEFAULTSTRING, DEFAULTUPDATESTRING },
  25.     { CURSORDEFAULTSTRING, DEFAULTCURSORSTRING },
  26.     { NULL }
  27. };
  28.  
  29. extern void timer(DPSTimedEntry, double, void *);
  30.  
  31. @implementation Magnify : Application
  32.  
  33. + new
  34. {
  35.     self = [super new];
  36.  
  37.     (void) registerDefaults(MagnifyDefaults);
  38.     
  39.     timedEntry = NULL;
  40.  
  41.     return self;
  42. }
  43.  
  44. - appDidInit:sender
  45. {    
  46.     MenuCell *cell;
  47.     double update;
  48.     const char *string;
  49.     Menu *menu = [self mainMenu];
  50.     Window *window = [view window];
  51.  
  52.     if ((string = getDefault(UPDATEDEFAULTSTRING)) == NULL || sscanf(string, DOUBLE, &update) != 1)
  53.         update = DEFAULTUPDATE;
  54.     
  55.     [[[self showScale:[view scale] andSlider:YES] showGrid:[view grid] andSlider:YES] showUpdate:update andSlider:YES];
  56.         
  57.     [cursorButton setIntValue:(strncmp(getDefault(CURSORDEFAULTSTRING), YESSTRING, 1) == 0)];
  58.  
  59.     [view setNextResponder:[window firstResponder]];
  60.  
  61.     [[window makeFirstResponder:view] addToEventMask:NX_MOUSEMOVEDMASK];
  62.  
  63.     if ((cell = [menu findCellWithTag:FROZENMENUCELLTAG]) != nil) {
  64.         [cell setUpdateAction:@selector(isFrozenUpdateAction:) forMenu:menu];
  65.         [menu update];
  66.         }
  67.         
  68.     [window makeKeyAndOrderFront:self];
  69.     
  70.     return self;
  71. }
  72.  
  73. - hide:sender
  74. {
  75.     if (![view isFrozen]) [[view window] removeFromEventMask:NX_MOUSEMOVEDMASK];
  76.     
  77.     return [super hide:sender];
  78. }
  79.  
  80. - unhide:sender
  81. {
  82.     if (![view isFrozen]) [[view window] addToEventMask:NX_MOUSEMOVEDMASK];
  83.     
  84.     return [super unhide:sender];
  85. }
  86.  
  87. - free
  88. {
  89.     if (timedEntry != NULL) DPSRemoveTimedEntry(timedEntry);
  90.  
  91.     return [super free];
  92. }
  93.  
  94. - changeScale:sender
  95. {
  96.     float scale, value = rint([sender floatValue]); /* 'intValue' truncates */
  97.  
  98.     scale = (value < -1.0) ? 1.0 / (- value) : 2.0 + value; /* non-linear slider */
  99.     
  100.     [[view setScale:(scale = floor(scale * 100.0) / 100.0)] createWindows]; /* round to nearest .01 */
  101.  
  102.     return [self showScale:scale andSlider:NO];
  103. }
  104.  
  105. - showScale:(float) scale andSlider:(BOOL) flag
  106. {
  107.     char title[] = WINDOWTITLEPROTOTYPE;
  108.     
  109.     if(flag) {
  110.         float value = rint((scale < 1) ? - (1 / scale) : scale - 2.0);
  111.     
  112.         if([scaleSlider floatValue] != value) [scaleSlider setFloatValue:value];
  113.         }
  114.  
  115.     if([scaleField floatValue] != scale) [scaleField setFloatValue:scale];
  116.     
  117.     sprintf(title, WINDOWTITLEFORMAT, scale);
  118.     
  119.     [[view window] setTitle:title];
  120.  
  121.     return self;
  122. }
  123.  
  124. - changeGrid:sender
  125. {
  126.     float grid = rint([sender floatValue]);
  127.     
  128.     [[view setGrid:grid] display];
  129.  
  130.     return [self showGrid:grid andSlider:NO];
  131. }
  132.  
  133. - showGrid:(float) grid andSlider:(BOOL) flag
  134. {
  135.     if(grid > 0.0) {
  136.         [gridField setFloatValue:grid];
  137.         if(flag && [gridSlider floatValue] != grid) [gridSlider setFloatValue:grid];
  138.         }
  139.     else {
  140.         [gridField setStringValue:OFFSTRING];
  141.         if(flag && [gridSlider floatValue] != 0.0) [gridSlider setFloatValue:0.0];
  142.         }
  143.  
  144.     return self;
  145. }
  146.  
  147. - changeUpdate:sender
  148. {
  149.     return [self showUpdate:rint([sender floatValue] * 10.0) / 10.0 andSlider:NO]; /* round to nearest 0.1 */
  150. }
  151.  
  152. - showUpdate:(double) update andSlider:(BOOL) flag
  153. {
  154.     if (timedEntry != NULL) DPSRemoveTimedEntry(timedEntry);
  155.  
  156.     if(update > 0.0) {
  157.         timedEntry = DPSAddTimedEntry(update, (DPSTimedEntryProc) &timer, (void *) view, NX_BASETHRESHOLD);
  158.         [updateField setFloatValue:update];
  159.         if(flag && [updateSlider floatValue] != update) [updateSlider setFloatValue:update];
  160.         }
  161.     else {
  162.         timedEntry = NULL;
  163.         [updateField setStringValue:OFFSTRING];
  164.         if(flag && [updateSlider floatValue] != 0.0) [updateSlider setFloatValue:0.0];
  165.         }
  166.         
  167.     return self;
  168. }
  169.  
  170. - (MagnifyView *) getView { return view; }
  171. - setView:(MagnifyView *) anObject { view = anObject; return self; }
  172.  
  173. - setVersion:anObject
  174. {
  175.     [(version = anObject) setStringValue:VERSION];
  176.     
  177.     return self;
  178. }
  179.  
  180. - (int) msgVersion:(const char **) aString ok:(int *) flag
  181. {
  182.     *flag = ((*aString = [version stringValue]) != NULL);
  183.  
  184.     return SEND_SUCCESS;
  185. }
  186.  
  187. - (BOOL) isFrozenUpdateAction:(MenuCell *) anObject
  188. {
  189.     BOOL flag = [[NXApp getView] isFrozen];
  190.     
  191.     if ([anObject tag] == flag) return NO;
  192.     
  193.     [[anObject setTag:(int) flag] setTitle:(flag) ? UNFROZENMENUTITLE : FROZENMENUTITLE];
  194.     [anObject setKeyEquivalent:tolower([anObject title][0])];
  195.     
  196.     return YES;
  197. }
  198.  
  199. @end
  200.